home *** CD-ROM | disk | FTP | other *** search
- /* FSIN, FCOS, FSINCOS */
-
-
- #include "types.h"
- #include "fpu_emul.h"
- #include "frame.h"
-
- void fpu_sin_or_cos(struct fpemu *, int);
-
- struct xtable {
- int sp_exp;
- u_int sp_m0,sp_m1,sp_single;
- } pitbl[]= {
-
- { 0xC0040000,0xC90FDAA2,0x2168C235,0x21800000 },
- { 0xC0040000,0xC2C75BCD,0x105D7C23,0xA0D00000 },
- { 0xC0040000,0xBC7EDCF7,0xFF523611,0xA1E80000 },
- { 0xC0040000,0xB6365E22,0xEE46F000,0x21480000 },
- { 0xC0040000,0xAFEDDF4D,0xDD3BA9EE,0xA1200000 },
- { 0xC0040000,0xA9A56078,0xCC3063DD,0x21FC0000 },
- { 0xC0040000,0xA35CE1A3,0xBB251DCB,0x21100000 },
- { 0xC0040000,0x9D1462CE,0xAA19D7B9,0xA1580000 },
- { 0xC0040000,0x96CBE3F9,0x990E91A8,0x21E00000 },
- { 0xC0040000,0x90836524,0x88034B96,0x20B00000 },
- { 0xC0040000,0x8A3AE64F,0x76F80584,0xA1880000 },
- { 0xC0040000,0x83F2677A,0x65ECBF73,0x21C40000 },
- { 0xC0030000,0xFB53D14A,0xA9C2F2C2,0x20000000 },
- { 0xC0030000,0xEEC2D3A0,0x87AC669F,0x21380000 },
- { 0xC0030000,0xE231D5F6,0x6595DA7B,0xA1300000 },
- { 0xC0030000,0xD5A0D84C,0x437F4E58,0x9FC00000 },
- { 0xC0030000,0xC90FDAA2,0x2168C235,0x21000000 },
- { 0xC0030000,0xBC7EDCF7,0xFF523611,0xA1680000 },
- { 0xC0030000,0xAFEDDF4D,0xDD3BA9EE,0xA0A00000 },
- { 0xC0030000,0xA35CE1A3,0xBB251DCB,0x20900000 },
- { 0xC0030000,0x96CBE3F9,0x990E91A8,0x21600000 },
- { 0xC0030000,0x8A3AE64F,0x76F80584,0xA1080000 },
- { 0xC0020000,0xFB53D14A,0xA9C2F2C2,0x1F800000 },
- { 0xC0020000,0xE231D5F6,0x6595DA7B,0xA0B00000 },
- { 0xC0020000,0xC90FDAA2,0x2168C235,0x20800000 },
- { 0xC0020000,0xAFEDDF4D,0xDD3BA9EE,0xA0200000 },
- { 0xC0020000,0x96CBE3F9,0x990E91A8,0x20E00000 },
- { 0xC0010000,0xFB53D14A,0xA9C2F2C2,0x1F000000 },
- { 0xC0010000,0xC90FDAA2,0x2168C235,0x20000000 },
- { 0xC0010000,0x96CBE3F9,0x990E91A8,0x20600000 },
- { 0xC0000000,0xC90FDAA2,0x2168C235,0x1F800000 },
- { 0xBFFF0000,0xC90FDAA2,0x2168C235,0x1F000000 },
- { 0x00000000,0x00000000,0x00000000,0x00000000 },
- { 0x3FFF0000,0xC90FDAA2,0x2168C235,0x9F000000 },
- { 0x40000000,0xC90FDAA2,0x2168C235,0x9F800000 },
- { 0x40010000,0x96CBE3F9,0x990E91A8,0xA0600000 },
- { 0x40010000,0xC90FDAA2,0x2168C235,0xA0000000 },
- { 0x40010000,0xFB53D14A,0xA9C2F2C2,0x9F000000 },
- { 0x40020000,0x96CBE3F9,0x990E91A8,0xA0E00000 },
- { 0x40020000,0xAFEDDF4D,0xDD3BA9EE,0x20200000 },
- { 0x40020000,0xC90FDAA2,0x2168C235,0xA0800000 },
- { 0x40020000,0xE231D5F6,0x6595DA7B,0x20B00000 },
- { 0x40020000,0xFB53D14A,0xA9C2F2C2,0x9F800000 },
- { 0x40030000,0x8A3AE64F,0x76F80584,0x21080000 },
- { 0x40030000,0x96CBE3F9,0x990E91A8,0xA1600000 },
- { 0x40030000,0xA35CE1A3,0xBB251DCB,0xA0900000 },
- { 0x40030000,0xAFEDDF4D,0xDD3BA9EE,0x20A00000 },
- { 0x40030000,0xBC7EDCF7,0xFF523611,0x21680000 },
- { 0x40030000,0xC90FDAA2,0x2168C235,0xA1000000 },
- { 0x40030000,0xD5A0D84C,0x437F4E58,0x1FC00000 },
- { 0x40030000,0xE231D5F6,0x6595DA7B,0x21300000 },
- { 0x40030000,0xEEC2D3A0,0x87AC669F,0xA1380000 },
- { 0x40030000,0xFB53D14A,0xA9C2F2C2,0xA0000000 },
- { 0x40040000,0x83F2677A,0x65ECBF73,0xA1C40000 },
- { 0x40040000,0x8A3AE64F,0x76F80584,0x21880000 },
- { 0x40040000,0x90836524,0x88034B96,0xA0B00000 },
- { 0x40040000,0x96CBE3F9,0x990E91A8,0xA1E00000 },
- { 0x40040000,0x9D1462CE,0xAA19D7B9,0x21580000 },
- { 0x40040000,0xA35CE1A3,0xBB251DCB,0xA1100000 },
- { 0x40040000,0xA9A56078,0xCC3063DD,0xA1FC0000 },
- { 0x40040000,0xAFEDDF4D,0xDD3BA9EE,0x21200000 },
- { 0x40040000,0xB6365E22,0xEE46F000,0xA1480000 },
- { 0x40040000,0xBC7EDCF7,0xFF523611,0x21E80000 },
- { 0x40040000,0xC2C75BCD,0x105D7C23,0x20D00000 },
- { 0x40040000,0xC90FDAA2,0x2168C235,0xA1800000 },
- };
-
- static u_int sinA7[] = { 0xBD6AAA77,0xCCC994F5 };
- static u_int sinA6[] = { 0x3DE61209,0x7AAE8DA1 };
- static u_int sinA5[] = { 0xBE5AE645,0x2A118AE4 };
- static u_int sinA4[] = { 0x3EC71DE3,0xA5341531 };
- static u_int sinA3[] = { 0xBF2A01A0,0x1A018B59,0x00000000 };
- static u_int sinA2[] = { 0x3FF80000,0x88888888,0x888859AF };
- static u_int sinA1[] = { 0xBFFC0000,0xAAAAAAAA,0xAAAAAA99 };
-
- static u_int cosB8[] = { 0x3D2AC4D0,0xD6011EE3 };
- static u_int cosB7[] = { 0xBDA9396F,0x9F45AC19 };
- static u_int cosB6[] = { 0x3E21EED9,0x0612C972 };
- static u_int cosB5[] = { 0xBE927E4F,0xB79D9FCF };
- static u_int cosB4[] = { 0x3EFA01A0,0x1A01D423,0x00000000 };
- static u_int cosB3[] = { 0xBFF50000,0xB60B60B6,0x0B61D438 };
- static u_int cosB2[] = { 0x3FFA0000,0xAAAAAAAA,0xAAAAAB5E };
- static u_int cosB1[] = { 0xBF000000 };
-
-
- extern u_int TWOBYPI[];
- extern u_int TWOPI[];
-
-
-
-
- void fpu_sin_or_cos(struct fpemu *fe, int Adj)
- {
-
- static struct fpn X,S;
- static struct fpn *d;
- int N,sign;
-
-
-
- CPYFPN(&X, &fe->fe_f2);
-
- /* reduce argument if necessary */
- if(X.fp_exp > 5 || (X.fp_exp == 5 && X.fp_mant[0] >= (0xbc7e00 >> (31 - FP_LG))) ) {
- CPYFPN(&fe->fe_f1,&fe->fe_f2);
- fpu_explode(fe, &fe->fe_f2,FTYPE_EXT, TWOPI);
-
- d=fpu_rem(fe);
- CPYFPN(&X ,d);
-
- };
- if(X.fp_exp <= -40) {
- switch(Adj) {
- case 0:
-
- return;
- case 1:
- fpu_const(&fe->fe_f2,0x32);
- return;
- };
- };
-
-
-
-
-
- fpu_explode(fe, &fe->fe_f1, FTYPE_DBL, TWOBYPI);
- CPYFPN(&fe->fe_f2,&X)
- d = fpu_mul(fe);
- fpu_implode(fe, d, FTYPE_LNG, &N);
-
-
-
- CPYFPN(&fe->fe_f1, &X);
- fpu_explode(fe, &fe->fe_f2, FTYPE_EXT, &(pitbl[32+N].sp_exp));
- fe->fe_f2.fp_sign= ! fe->fe_f2.fp_sign;
- d=fpu_add(fe);
-
- CPYFPN(&fe->fe_f1, d);
- fpu_explode(fe, &fe->fe_f2, FTYPE_SNG, &(pitbl[32+N].sp_single));
- fe->fe_f2.fp_sign= ! fe->fe_f2.fp_sign;
- d=fpu_add(fe);
-
-
-
- CPYFPN(&X, d);
- CPYFPN(&fe->fe_f1, d);
- CPYFPN(&fe->fe_f2, d);
- d=fpu_mul(fe);
- CPYFPN(&S, d);
-
-
- N+=Adj;
-
-
-
- if(N & 0xfffffffe != N) {
-
-
-
- sign=((N-1) >>1) & 0x00000001;
-
- CPYFPN(&fe->fe_f1, &S);
- fpu_explode(fe, &fe->fe_f2, FTYPE_DBL, cosB8);
- d=fpu_mul(fe);
- CPYFPN(&fe->fe_f2, d);
- fpu_explode(fe, &fe->fe_f1, FTYPE_DBL, cosB7);
- d=fpu_add(fe);
- CPYFPN(&fe->fe_f2, d);
-
- CPYFPN(&fe->fe_f1, &S);
- d=fpu_mul(fe);
- CPYFPN(&fe->fe_f2,d);
- fpu_explode(fe, &fe->fe_f1, FTYPE_DBL, cosB6);
- d=fpu_add(fe);
- CPYFPN(&fe->fe_f2, d);
-
-
- CPYFPN(&fe->fe_f1, &S);
- d=fpu_mul(fe);
- CPYFPN(&fe->fe_f2,d);
- fpu_explode(fe, &fe->fe_f1, FTYPE_DBL, cosB5);
- d=fpu_add(fe);
- CPYFPN(&fe->fe_f2, d);
-
-
- CPYFPN(&fe->fe_f1, &S);
- d=fpu_mul(fe);
- CPYFPN(&fe->fe_f2,d);
- fpu_explode(fe, &fe->fe_f1, FTYPE_EXT, cosB4);
- d=fpu_add(fe);
- CPYFPN(&fe->fe_f2, d);
-
- CPYFPN(&fe->fe_f1, &S);
- d=fpu_mul(fe);
- CPYFPN(&fe->fe_f2,d);
- fpu_explode(fe, &fe->fe_f1, FTYPE_EXT, cosB3);
- d=fpu_add(fe);
- CPYFPN(&fe->fe_f2, d);
-
-
- CPYFPN(&fe->fe_f1, &S);
- d=fpu_mul(fe);
- CPYFPN(&fe->fe_f2,d);
- fpu_explode(fe, &fe->fe_f1, FTYPE_EXT, cosB2);
- d=fpu_add(fe);
- CPYFPN(&fe->fe_f2, d);
-
-
- CPYFPN(&fe->fe_f1, &S);
- d=fpu_mul(fe);
- CPYFPN(&fe->fe_f2,d);
- fpu_explode(fe, &fe->fe_f1, FTYPE_SNG, cosB1);
- d=fpu_add(fe);
- CPYFPN(&fe->fe_f2, d);
-
-
- CPYFPN(&fe->fe_f1, &S);
- d=fpu_mul(fe);
- CPYFPN(&fe->fe_f2,d);
- fpu_const(&fe->fe_f1, 0x32);
- d=fpu_add(fe);
- CPYFPN(&fe->fe_f2, d);
-
- fe->fe_f2.fp_sign=sign;
-
-
-
- } else {
-
- sign=(N >> 1) & 0x00000001;
-
-
- CPYFPN(&fe->fe_f1, &S);
- fpu_explode(fe, &fe->fe_f2, FTYPE_DBL, sinA7);
- d=fpu_mul(fe);
- CPYFPN(&fe->fe_f2, d);
- fpu_explode(fe, &fe->fe_f1, FTYPE_DBL, sinA6);
- d=fpu_add(fe);
- CPYFPN(&fe->fe_f2, d);
-
- CPYFPN(&fe->fe_f1, &S);
- d=fpu_mul(fe);
- CPYFPN(&fe->fe_f2,d);
- fpu_explode(fe, &fe->fe_f1, FTYPE_DBL, sinA5);
- d=fpu_add(fe);
- CPYFPN(&fe->fe_f2, d);
-
-
- CPYFPN(&fe->fe_f1, &S);
- d=fpu_mul(fe);
- CPYFPN(&fe->fe_f2,d);
- fpu_explode(fe, &fe->fe_f1, FTYPE_DBL, sinA4);
- d=fpu_add(fe);
- CPYFPN(&fe->fe_f2, d);
-
-
- CPYFPN(&fe->fe_f1, &S);
- d=fpu_mul(fe);
- CPYFPN(&fe->fe_f2,d);
- fpu_explode(fe, &fe->fe_f1, FTYPE_EXT, sinA3);
- d=fpu_add(fe);
- CPYFPN(&fe->fe_f2, d);
-
-
-
- CPYFPN(&fe->fe_f1, &S);
- d=fpu_mul(fe);
- CPYFPN(&fe->fe_f2,d);
- fpu_explode(fe, &fe->fe_f1, FTYPE_EXT, sinA2);
- d=fpu_add(fe);
- CPYFPN(&fe->fe_f2, d);
-
-
- CPYFPN(&fe->fe_f1, &S);
- d=fpu_mul(fe);
- CPYFPN(&fe->fe_f2,d);
- fpu_explode(fe, &fe->fe_f1, FTYPE_EXT, sinA1);
- d=fpu_add(fe);
- CPYFPN(&fe->fe_f2, d);
-
-
- CPYFPN(&fe->fe_f1, &S);
- d=fpu_mul(fe);
- CPYFPN(&fe->fe_f2,d);
- CPYFPN(&fe->fe_f1, &X);
- d=fpu_mul(fe);
- CPYFPN(&fe->fe_f2,d);
- CPYFPN(&fe->fe_f1, &X);
- d=fpu_add(fe);
- CPYFPN(&fe->fe_f2, d);
-
- fe->fe_f2.fp_sign=sign;
-
-
-
-
- };
-
- }
- struct fpn *
- fpu_cos(fe)
- struct fpemu *fe;
- {
- fpu_sin_or_cos(fe, 1);
- return &fe->fe_f2;
- }
-
- struct fpn *
- fpu_sin(fe)
- struct fpemu *fe;
- {
- fpu_sin_or_cos(fe, 0);
- return &fe->fe_f2;
- }
-
- struct fpn *
- fpu_sincos(fe, regc)
- struct fpemu *fe;
- int regc;
- {
- struct fpn X;
- u_int *fpregs = &(fe->fe_fpframe->fpf_regs[regc*3]);
-
-
- CPYFPN(&X, &fe->fe_f2);
- fpu_sin_or_cos(fe,1);
- fpu_implode(fe, &fe->fe_f2, FTYPE_EXT, fpregs);
-
-
- CPYFPN(&fe->fe_f2, &X);
- fpu_sin_or_cos(fe,0);
- return &fe->fe_f2;
- }
-